home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / asm / alib11b.zip / CODE1.ZIP / DEBUG / TRAP.ASM < prev    next >
Assembly Source File  |  1994-10-03  |  8KB  |  283 lines

  1.     page    60,132
  2. ;--------------------------------------------------------------------------
  3. ;
  4. ; TRAP  V1.2  -  break using alt-esc
  5. ;
  6. ; TRAP   is a resident program that uses ctrl-esc to go to debug if it
  7. ;        is loaded  else DOS is resarted and current program aborted.
  8. ;
  9. ; NOTE: When Alt-esc   is hit the hardware interrupts (below 20H) are
  10. ;    all reset to their values as of when the program was installed.
  11. ;    Therefore, if you are installing resident programs which steal
  12. ;    these interrupts they should be installed BEFORE this program.
  13. ;    This program steals int 09H and int 1BH.
  14. ;
  15. ;    Cntl-esc   resets the system timer to run at the normal rate,
  16. ;    and restores the video mode to the state it was in when EBREAK
  17. ;    was installed.
  18. ;
  19. ;-------------------------------------------------------------------------
  20. ;PURPOSE:  TRAP will recover from most computer failures when
  21. ;          interrupts are enabled.  Optionally, it will envoke DEBUG
  22. ;          if any breakpoints are set.  If DEBUG is not loaded the
  23. ;          current DOS process is aborted and DOS given control.
  24. ;
  25. ;          Programmers (or maybe just hackers) are always putting the
  26. ;          computer in an infinite loop somewhere, followed by a long
  27. ;          debug secession to find the problem.  TRAP will speed up
  28. ;          the process by aborting out of loops and jumping to DEBUG.
  29. ;
  30. ;          Another use for TRAP is to improve upon the DOS break key.
  31. ;          Sometimes the break key is disabled and not available
  32. ;          or the break logic isn't working.  In either case TRAP
  33. ;          will force a break and avoid the slow Ctrl-ALT-DEL option.
  34. ;
  35. ;USAGE:    TRAP is memory resident and should be loaded when the computer
  36. ;          is turned on or before a debugging scession.  It waits for
  37. ;          the keys  Alt-Esc using the following logic:
  38. ;
  39. ;          Alt-Esc
  40. ;          pressed? --yes--> debug   --yes--> simulate breakpoint.
  41. ;            |               present?         jump to DEBUG
  42. ;           no                 |
  43. ;            |                 no
  44. ;          exit                |
  45. ;                            abort current
  46. ;                            DOS process
  47. ;
  48. ;          The presense of DEBUG is detected by looking at the break interrupt
  49. ;          (interrupt 3) to see if any breaks are set.  Thus, any debugger
  50. ;          with a breakpoint set will work with TRAP.  The location of the
  51. ;          breakpoint is not important.  DEBUG will be passed the location
  52. ;          where the real break occured and will report that address.
  53. ;
  54. ;CAUTIONS: The break to DOS  restores all interrupt vectors and other
  55. ;          machine states at the point TRAP was loaded.  If other memory
  56. ;          resident programs are loaded after TRAP, they may be disabled.
  57. ;          It is important that TRAP be loaded as the last memory resident
  58. ;          program.
  59. ;
  60. ;          The break key can hang the system if it conflicts with another
  61. ;          memory resident program.  The origional TRAP used ctrl-esc which
  62. ;          conflicted with several resident pop ups.  If the new alt-esc
  63. ;          is a problem then location 104 can be patched as follows:
  64. ;                  08 -  alt-esc active
  65. ;                  04 -  ctrl-esc active
  66. ;                  02 -  right shift-esc active
  67. ;                  01 -  left shift-esc active
  68. ;                                                
  69. ;CREDITS:  TRAP was programmed by Jeff Owens using some material from public
  70. ;          domain programs EBREAK and BREAKPT.
  71. ;          
  72. ;
  73. ;          Comments, suggestions, complaints, or changes you have made would be
  74. ;          appreciated.  Jeff Owens kowens@teleport.com
  75. ;
  76. ;----------------------------------------------------------------------
  77. ;trap.com:    trap.obj
  78. ;            link trap;
  79. ;            exe2bin trap trap.com
  80. ;            del trap.exe
  81. ;
  82. ;trap.obj:    trap.asm
  83. ;            masm trap;
  84. ;------------------------------------------------------------------------
  85.   
  86. code    segment    para    public
  87.     assume    cs:code
  88.  
  89. IntVecs    segment    at    0
  90.     org    9 * 4
  91. int_9        dd    ?
  92.     org    417H
  93. KB_FLAG    DB    ?
  94.     org    449H
  95. video_state    db    ?
  96. IntVecs    ends
  97.  
  98.     org    2Ch
  99. environment    label    word
  100. ;
  101. ; the psp is used to hold variables as follows
  102. ;
  103.     org    07cH
  104.     
  105. orig_int_tbl    db    80H dup(?)    ; room for copy of int tbl
  106.                     ; Note that table is on a double word
  107. initial_mode    db    ?        ; initial video mode
  108. int_mask    db    ?        ; original interrupts enabled
  109.  
  110. debug    label    dword
  111. debug_offset     dw    ?
  112. debug_segment    dw    ?
  113.  
  114. ;-------------------------------------------------------------------------
  115.     org    100h
  116. start:    jmp    setup
  117. trigger_mask    db    08h        ; enable key
  118.  
  119.     assume    ds:nothing, es:nothing
  120.  
  121. handle_9    proc    far        ; grabs the code segment of
  122.     push    ax
  123.     push    ds    
  124.         IN      AL,60H          ;CHECK SCAN CODE
  125.         CMP     AL,01           ;IS IT END KEY?
  126.         JNZ     no_break        ;NO, ON TO KEYBOARD ROUTINE
  127.         XOR     AX,AX           ;CONTROL KEY SHIFT
  128.         MOV     DS,AX           ;GET DOWN TO THE BOTTOM
  129.         MOV     AL,BYTE PTR DS:KB_FLAG ;GET KEYBOARD FLAG BYTE FROM ROM DATA
  130.         TEST    AL,cs:trigger_mask  ;alt? ctrl? etc
  131.         jnz    ctrl_esc_found    ;jump if ctrl_esc pressed
  132. no_break:
  133.     pop    ds
  134.     pop    ax
  135.     db    0eah
  136. real_int_9  dd    ?
  137.         
  138. ;
  139. ; eat this key and re-enable the keyboard
  140. ;
  141. ctrl_esc_found:
  142.         IN      AL,61H          ;OTHERWISE, WE TAKE IT FROM HERE
  143.         MOV     AH,AL           ;RESET
  144.         OR      AL,80H          ;THE
  145.         OUT     61H,AL          ;KEYBOARD
  146.         MOV     AL,AH           ;CONTROL
  147.         OUT     61H,AL          ;PORT
  148.         CLI                     ;TURN OFF INTERRUPTS
  149.         MOV     AL,20H          ;RESET INTERRUPT CONTROLLER (8259)
  150.         OUT     20H,AL
  151.         STI                     ;LET PENDING INTERRUPTS EXECUTE
  152. ;
  153. ; check if debug is active
  154. ;
  155.     sub    ax,ax
  156.     mov    ds,ax            ;point at low ram
  157.     mov    ax,cs            ;get our segment
  158.     cmp    word ptr ds:[0eh],ax    ;check if debug has int 3
  159.     jbe    no_debug        ;jump if debug missing
  160. ;
  161. ; go to debug without desturbing the stack
  162. ;
  163.     mov    ax,word ptr ds:[0ch]
  164.     mov    cs:debug_offset,ax
  165.     mov    ax,word ptr ds:[0eh]
  166.     mov    cs:debug_segment,ax
  167.         POP     DS
  168.         POP     AX
  169. ;
  170. ; adjust the return address seen by debug
  171. ;
  172.     push    bp
  173.     mov    bp,sp
  174.     inc    word ptr [bp+2]        ;adjust the return address
  175.     pop    bp
  176.            
  177.         jmp    debug
  178.  
  179. no_debug:
  180.     in    al,61H            ; turn off sound
  181.     jmp    short $+2
  182.     and    al,0FCH
  183.     out    61H,al
  184.  
  185.     mov    al,36H            ; reset system timer
  186.     out    43H,al
  187.     xor    al,al
  188.     jmp    short $+2
  189.     out    40H,al
  190.     jmp    short $+2
  191.     out    40H,al
  192.  
  193.     mov    cx,40H            ; restore int tbl
  194.     push    cs
  195.     pop    ds
  196.     assume    ds:code
  197.     xor    ax,ax
  198.     mov    es,ax
  199.     assume    es:IntVecs
  200.     mov    di,ax
  201.     mov    si,offset orig_int_tbl
  202.     cli
  203.     cld
  204.     rep    movsw
  205.  
  206.     mov    al,int_mask        ; restore enabled ints
  207.     out    21H,al
  208.     sti
  209.  
  210.     mov    al,initial_mode        ; set video back to original
  211.     cmp    video_state,al
  212.     je    vid_ok
  213.     xor    ah,ah
  214.     int    10H
  215. vid_ok:
  216.  
  217.     mov    ax,4C01h        ; can we really do this?!!?
  218.     int    21H            ; YOW!
  219. handle_9    endp
  220. handler_end    label    byte
  221.  
  222.  
  223. installing_msg    db    'TRAP V1.2 installed.',0dh,0ah
  224.         db    'Alt-Esc will abort any program or call DEBUG if a breakpoint is set.'
  225.         db    0dh,0ah
  226.         db    'Copyright 1987 Owens Consulting',
  227.         db     0Dh, 0Ah,'$'
  228.     assume    ds:code, es:nothing
  229. steal    proc    far
  230. setup:
  231. ;    mov    es,environment        ; free environment area
  232. ;    mov    ax,4900H
  233. ;    int    21H
  234. ;
  235. ; take over int9
  236. ;
  237.     xor    ax,ax            ; set up es to IntVecs
  238.     mov    es,ax
  239.     assume    es:IntVecs
  240.  
  241.     cli
  242.     mov    bx,9*4            ;vector address
  243.     mov    ax,word ptr es:[bx]
  244.     mov    word ptr real_int_9,ax
  245.     mov    ax,word ptr es:[bx+2]
  246.     mov    word ptr real_int_9+2,ax
  247.     mov    word ptr es:[bx], offset handle_9
  248.     mov    word ptr es:[bx+2],cs
  249.     sti
  250. ;
  251. ; save interrupt vector state
  252. ;
  253.     mov    cx,40H            ; save int tbl
  254.     push    cs
  255.     pop    es
  256.     assume    es:code
  257.     xor    ax,ax
  258.     mov    ds,ax
  259.     assume    ds:IntVecs
  260.     mov    si,ax
  261.     mov    di,offset orig_int_tbl
  262.     cld
  263.     rep    movsw
  264.  
  265.     in    al,21H            ; save enabled ints
  266.     mov    int_mask,al
  267.  
  268.     mov    al,video_state        ; save video mode
  269.     mov    initial_mode,al
  270.  
  271.     push    cs
  272.     pop    ds            ; restore segment
  273.     assume    ds:code
  274.     mov    dx,offset installing_msg
  275.     mov    ah,9
  276.     int    21h
  277.     mov    dx,offset handler_end
  278.     int    27H            ; terminate and stay resident
  279. steal    endp
  280.  
  281. code    ends
  282.     end    start
  283.